-
Notifications
You must be signed in to change notification settings - Fork 5
bpf: Fix tnum_overlap to check for zero mask intersection #6237
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: bpf-next_base
Are you sure you want to change the base?
bpf: Fix tnum_overlap to check for zero mask intersection #6237
Conversation
|
Upstream branch: f9db3a3 |
|
Upstream branch: f9db3a3 |
126a96d to
670f396
Compare
2991dd5 to
583dec7
Compare
|
Upstream branch: 8842732 |
670f396 to
a91e505
Compare
583dec7 to
e224139
Compare
|
Upstream branch: 23f852d |
a91e505 to
57219ef
Compare
e224139 to
1f11231
Compare
|
Upstream branch: 54c134f |
57219ef to
b38a5b1
Compare
1f11231 to
2563a04
Compare
|
Upstream branch: 9f317bd |
b38a5b1 to
d3bdb50
Compare
2563a04 to
b8a9697
Compare
|
Upstream branch: 54c134f |
d3bdb50 to
13411f2
Compare
b8a9697 to
0ff1d70
Compare
|
Upstream branch: e2e668b |
13411f2 to
0b54c9f
Compare
0ff1d70 to
75ba762
Compare
|
Upstream branch: d28c0e4 |
0b54c9f to
ff2772e
Compare
75ba762 to
385f65b
Compare
|
Upstream branch: 5701d5a |
ff2772e to
ab6f527
Compare
385f65b to
9a71dd4
Compare
|
Upstream branch: ab01bfa |
Syzbot reported a kernel warning due to a range invariant violation in the BPF verifier. The issue occurs when tnum_overlap() fails to detect that two tnums don't have any overlapping bits. The problematic BPF program: 0: call bpf_get_prandom_u32 1: r6 = r0 2: r6 &= 0xFFFFFFFFFFFFFFF0 3: r7 = r0 4: r7 &= 0x07 5: r7 -= 0xFF 6: if r6 == r7 goto <exit> After instruction 5, R7 has the range: R7: u64=[0xffffffffffffff01, 0xffffffffffffff08] var_off=(0xffffffffffffff00; 0xf) R6 and R7 don't overlap since they have no agreeing bits. However, is_branch_taken() fails to recognize this, causing the verifier to refine register bounds and trigger range bounds violation: 6: if r6 == r7 goto <exit> true_reg1: u64=[0xffffffffffffff01, 0xffffffffffffff00] var_off=(0xffffffffffffff00, 0x0) true_reg2: u64=[0xffffffffffffff01, 0xffffffffffffff00] var_off=(0xffffffffffffff00, 0x0) The root cause is that tnum_overlap() doesn't properly handle the case where the masks have no overlapping bits. Fix this by adding an early check for zero mask intersection in tnum_overlap(). Reported-by: [email protected] Fixes: f41345f ("bpf: Use tnums for JEQ/JNE is_branch_taken logic") Signed-off-by: KaFai Wan <[email protected]> Reported-by: [email protected]
This patch adds coverage for the warning detected by syzkaller and fixed in the previous patch. Without the previous patch, this test fails with: verifier bug: REG INVARIANTS VIOLATION (true_reg1): range bounds violation u64=[0xffffffffffffff01, 0xffffffffffffff00] s64=[0xffffffffffffff01, 0xffffffffffffff00] u32=[0xffffff01, 0xffffff00] s32=[0xffffff00, 0xffffff00] var_off=(0xffffffffffffff00, 0x0) verifier bug: REG INVARIANTS VIOLATION (true_reg2): range bounds violation u64=[0xffffffffffffff01, 0xffffffffffffff00] s64=[0xffffffffffffff01, 0xffffffffffffff00] u32=[0xffffff01, 0xffffff00] s32=[0xffffff01, 0xffffff00] var_off=(0xffffffffffffff00, 0x0) Signed-off-by: KaFai Wan <[email protected]>
ab6f527 to
7341e89
Compare
Pull request for series with
subject: bpf: Fix tnum_overlap to check for zero mask intersection
version: 2
url: https://patchwork.kernel.org/project/netdevbpf/list/?series=1016789